<?php

namespace app\common\exception;

//用于继承tp5的全局异常处理类,用来重写其中的render方法来做最终的异常处理
use app\common\tools\ApiJson;
use think\facade\Config;
use think\exception\Handle;
use Exception;
use think\facade\Log;
use think\exception\ValidateException;

//总的异常处理类
class ExceptionHandler extends Handle
{
    use ApiJson;
    private $code = 500;
    private $msg = '服务器内部错误';
    private $errorCode = 999;

    public function render(\Exception $e)
    {
        //异常来自验证器
        if ($e instanceof ValidateException) {
            $this->code = 100;
            $this->msg = $e->getMessage();
            $this->errorCode = 100;
        } //如果这个传入的异常类是我们自定义的异常类的话,就说明这个异常在我们的控制之中
        else if ($e instanceof ErrorException) {
            //将该异常设定好的属性给赋值到总的异常处理类
            $this->code = $e->code;
            $this->msg = $e->msg;
            $this->errorCode = $e->errCode;
        } else {
            //判断配置中的dbug是否开启确定开发或生产模式
            if (Config::get('app_debug')) {
                //如果是开发模式
                return parent::render($e);
            }
            //全局的记录日志
            $this->recordErrorLog($e);
        }
        //返回异常信息到客户端
        return $this->responseJsonData([], $this->errorCode, $this->msg, $this->code);
    }

    /**
     * @param $e
     * 传入异常对象
     */
    private function recordErrorLog(Exception $e)
    {
        //由于在config文件中关闭了tp5自己的日志系统,我们需要重新初始化下
        Log::init([
            'type' => 'file',
            'path' => env('RUNTIME_PATH') . 'log',
            'level' => ['emergency', 'alert', 'critical', 'error', 'sql'],
            'max_files' => 30,
            'file_size' => 1024 * 1024 * 10,
        ]);
        //记录日志,传入异常的信息
        Log::write($e->getMessage(), 'error');
    }
}
